# -*- coding: utf-8 -*-
'''如果没有错误发生，可以在except语句块后面加一个else，当没有错误发生时，会自动执行else语句：'''
try:
    print('try...')
    r = 10 / int('2')
    print('result:', r)
except ValueError as e:
    print('ValueError:', e)
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
else:
    print('no error!')
finally:
    print('finally...')
print('END')
'''
Python所有的错误都是从BaseException类派生的，常见的错误类型和继承关系看这里：
https://docs.python.org/3/library/exceptions.html#exception-hierarchy
'''
'''使用try...except捕获错误还有一个巨大的好处，就是可以跨越多层调用，比如函数main()调用foo()，foo()调用bar()，结果bar()出错了，这时，只要main()捕获到了，就可以处理：'''
import logging
def foo(s):
    assert s != 0, 'n is zero!'
    if s == 0:
        raise ValueError('invalid value: %s' % s)#错误通过raise语句抛出去
    return 10 /  int(s)

def bar(s):
    return foo(s) * 2

def main(s):
    try:
        bar(s)
    except Exception as e:
        logging.exception(e)#Python内置的logging模块可以非常容易地记录错误信息,还可以把错误记录到日志文件里，方便事后排查。
        print('Error:', e)
    finally:
        print('finally...')
#print main(0)
'''logging的好处，它允许你指定记录信息的级别，有debug，info，warning，error等几个级别，当我们指定level=INFO时，logging.debug就不起作用了。
同理，指定level=WARNING后，debug和info就不起作用了。这样一来，你可以放心地输出不同级别的信息，也不用删除，最后统一控制输出哪个级别的信息。'''
import logging
logging.basicConfig(level=logging.INFO)

s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)

